home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 April: Mac OS SDK / Dev.CD Apr 98 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / Samples / SampleCode / Plug-in - WireFrame Renderer / SR_MarkerRenderer.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-14  |  5.7 KB  |  243 lines  |  [TEXT/MPS ]

  1. /******************************************************************************
  2.  **                                                                             **
  3.  **     Module:        SR_MarkerRenderer.h                                         **
  4.  **                                                                          **
  5.  **                                                                          **
  6.  **     Purpose:                                                               **
  7.  **                                                                          **
  8.  **                                                                          **
  9.  **                                                                          **
  10.  **     Copyright (C) 1996 Apple Computer, Inc. All rights reserved.         **
  11.  **                                                                          **
  12.  **                                                                          **
  13.  *****************************************************************************/
  14. #include "QD3D.h"
  15.  
  16. #include "SR.h"
  17. #include "SR_Marker.h"
  18. #include "SR_Rasterizers.h"
  19.  
  20.  
  21. /*===========================================================================*\
  22.  *
  23.  *    Routine:    SRMarker_Rasterize_8
  24.  *                SRMarker_Rasterize_8_WClip
  25.  *                SRMarker_32_WClip
  26.  *                SRMarker_Rasterize_32_WClip
  27.  *
  28.  *    Comments:    
  29.  *
  30. \*===========================================================================*/
  31.  
  32. #if defined(SR_PIXELTYPE)
  33.     #undef SR_PIXELTYPE
  34. #endif  /*  SR_PIXELTYPE  */
  35.  
  36. #ifdef SR_RASTERIZE_8BITS
  37.  
  38.     #define    SR_PIXELTYPE    unsigned char
  39.     #define    SR_SIZEOF_PIXEL    1
  40.     
  41. #endif  /*  SR_RASTERIZE_8BITS  */
  42.  
  43. #ifdef SR_RASTERIZE_32BITS
  44.  
  45.     #define    SR_PIXELTYPE    unsigned long
  46.     #define    SR_SIZEOF_PIXEL    4
  47.     
  48. #endif  /*  SR_RASTERIZE_32BITS  */
  49.  
  50.  
  51. #ifdef SR_RASTERIZE_8BITS
  52.  
  53.     #ifdef SR_WIN_CLIP
  54.         TQ3Status SRMarker_Rasterize_8_WClip(
  55.     #else
  56.         TQ3Status SRMarker_Rasterize_8(
  57.     #endif  /*  SR_WIN_CLIP  */
  58.     
  59. #endif  /*  SR_RASTERIZE_8BITS  */
  60.  
  61.  
  62. #ifdef SR_RASTERIZE_32BITS
  63.     #ifdef SR_WIN_CLIP
  64.         TQ3Status SRMarker_Rasterize_32_WClip(
  65.     #else
  66.         TQ3Status SRMarker_Rasterize_32(
  67.     #endif  /*  SR_WIN_CLIP  */
  68. #endif  /*  SR_RASTERIZE_32BITS  */
  69.  
  70.     const struct TSRPrivate         *srPrivate, 
  71.     const TQ3Point3D            *pt0, 
  72.     const TSRMarkerRasterData    *markerRaster,
  73.     const TQ3ColorRGB             *pointColorRGB)
  74. {
  75.     long                rowBytes;
  76.     long                markerRowBytes;
  77.     SR_PIXELTYPE        *cBuffer;
  78.     
  79. #ifdef SR_WIN_CLIP
  80.     long                clipX, clipY;
  81.     TQ3Bitmap            *clipMask = NULL;
  82.     unsigned long        *clipMaskPtr, clipBits, clipXMask;
  83.     unsigned long        clipMaskRowBytes;
  84.     float                upperLeftX, upperLeftY;
  85. #endif  /*  SR_WIN_CLIP  */
  86.  
  87.     SR_PIXELTYPE        pointColor;
  88.     long                longX, longY;
  89.     long                width = markerRaster->bitmap->width - markerRaster->endRowSkip,
  90.                         height = markerRaster->bitmap->height - (markerRaster->startLineSkip + markerRaster->endLineSkip);
  91.     unsigned long        leftOver;
  92.     unsigned char        leftOverPickIndex = 0x80;
  93.     unsigned char        *cRowPtr;
  94.     unsigned char        *markerBitmap;
  95.     unsigned char        *markerRowPtr;
  96.  
  97.     const TQ3XDrawRegionDescriptor    *descriptor;
  98.     void                            *image;
  99.  
  100.     descriptor = srPrivate->descriptor;
  101.     image = srPrivate->image;
  102.     rowBytes = descriptor->rowBytes;
  103.     
  104. #ifdef SR_WIN_CLIP
  105.  
  106.     if (Q3XDrawRegion_GetClipMask(srPrivate->drawRegion, &clipMask) == kQ3Failure) {
  107.         return (kQ3Failure);
  108.     }
  109.     if (clipMask == NULL) {
  110.         return (kQ3Failure);
  111.     }
  112. #endif  /*  SR_WIN_CLIP  */
  113.  
  114.     markerRowBytes = markerRaster->bitmap->width;
  115.     markerRowBytes = markerRowBytes / 8 + (markerRowBytes % 8 > 0);
  116.  
  117.     longX = (long)pt0->x;
  118.     longY = (long)pt0->y;
  119.     
  120.     COLOR_TO_PIXEL(pointColor,
  121.                    srPrivate->drawRegion,
  122.                    descriptor->pixelType,
  123.                    pointColorRGB->r,
  124.                    pointColorRGB->g,
  125.                    pointColorRGB->b);
  126.  
  127.     cBuffer = (SR_PIXELTYPE *)((unsigned char *) image +
  128.                 (((long)longY * rowBytes) + 
  129.                     (long)longX * SR_SIZEOF_PIXEL));
  130.  
  131.  
  132. #ifdef SR_WIN_CLIP
  133.     clipMaskRowBytes = clipMask->rowBytes;
  134.     Q3XDrawRegion_GetDeviceOffsetX(srPrivate->drawRegion, &upperLeftX);
  135.     Q3XDrawRegion_GetDeviceOffsetY(srPrivate->drawRegion, &upperLeftY);
  136.  
  137.     clipX = longX - upperLeftX;
  138.     clipY = longY - upperLeftY;
  139.     clipMaskPtr = (unsigned long *)((unsigned char *)clipMask->image +
  140.                                     (clipY * clipMaskRowBytes) + ((clipX >> 5) << 2));
  141.     clipBits = *clipMaskPtr;
  142.     clipXMask = (unsigned long)(1 << (0x1F - (clipX & 0x1F))); 
  143. #endif  /*  SR_WIN_CLIP  */
  144.  
  145.     cRowPtr = (unsigned char *) cBuffer;
  146.     
  147.     markerRowPtr = markerRaster->bitmap->image;    
  148.     
  149.     leftOver = width & 0x00000007;
  150.     width -= leftOver;
  151.  
  152.     /* 
  153.      *  This is true if the marker is clipped on the top 
  154.      */
  155.     if (markerRaster->startLineSkip ) {
  156.         markerRowPtr += markerRaster->startLineSkip * markerRowBytes;
  157.     }
  158.     
  159.     /* 
  160.      *  This is true if the marker is clipped on the left 
  161.      */
  162.     if (markerRaster->startRowSkip) {
  163.         width -= markerRaster->startRowSkip;
  164.         markerRowPtr += markerRaster->startRowSkip / 8;
  165.         
  166.         if (width < 0) {
  167.             leftOver += width;
  168.             leftOverPickIndex >>= -width;
  169.         }
  170.     }
  171.  
  172.     do {
  173.         long            scanWidth, scanLeftOver;
  174.         unsigned char     pickIndex = 0x80 >> (markerRaster->startRowSkip & 0x7);
  175.  
  176.         cBuffer = (SR_PIXELTYPE *) cRowPtr;
  177.  
  178.         markerBitmap = markerRowPtr;
  179.  
  180.         scanWidth = width;
  181.         
  182.         if (scanWidth > 0) {
  183.             do {
  184.                 do {
  185.                     if ((*markerBitmap & pickIndex) 
  186. #ifdef SR_WIN_CLIP
  187.                         && (clipBits & clipXMask)
  188. #endif  /*  SR_WIN_CLIP  */
  189.                        ) {
  190.                         *cBuffer = pointColor;
  191.                     }
  192.                     cBuffer++;
  193. #ifdef SR_WIN_CLIP
  194.                     clipXMask >>= 1;
  195.                     if (clipXMask == 0) {
  196.                         clipMaskPtr++;
  197.                         clipXMask = (unsigned long)(1 << 0x1F);
  198.                         clipBits = *clipMaskPtr;
  199.                     }
  200. #endif  /*  SR_WIN_CLIP  */
  201.                     pickIndex >>= 1;
  202.                 } while (pickIndex);
  203.                 
  204.                 pickIndex = 0x80;
  205.                 markerBitmap++;
  206.                 scanWidth -= 8;
  207.                 
  208.             } while (scanWidth > 0);
  209.         }
  210.         
  211.         scanLeftOver = leftOver;
  212.         pickIndex = leftOverPickIndex;
  213.         
  214.         if (scanLeftOver > 0) {
  215.             do {
  216.                 if ((*markerBitmap & pickIndex) 
  217. #ifdef SR_WIN_CLIP
  218.                     && (clipBits & clipXMask)
  219. #endif  /*  SR_WIN_CLIP  */
  220.                     ){
  221.                     *cBuffer = pointColor;
  222.                 }
  223.                 cBuffer++;
  224. #ifdef SR_WIN_CLIP
  225.                 clipXMask >>= 1;
  226.                 if (clipXMask == 0) {
  227.                     clipMaskPtr++;
  228.                     clipXMask = (unsigned long)(1 << 0x1F);
  229.                     clipBits = *clipMaskPtr;
  230.                 }
  231. #endif  /*  SR_WIN_CLIP  */
  232.                 pickIndex >>= 1;
  233.             } while (--scanLeftOver && pickIndex);
  234.         }
  235.  
  236.         markerRowPtr += markerRowBytes;
  237.         cRowPtr += rowBytes;
  238.         
  239.     } while (--height);
  240.     
  241.     return (kQ3Success);
  242. }
  243.